/* PR c/102989 */
/* { dg-do run { target bitint } } */
/* { dg-options "-std=c23 -pedantic-errors" } */
/* { dg-skip-if "" { ! run_expensive_tests }  { "*" } { "-O0" "-O2" } } */
/* { dg-skip-if "" { ! run_expensive_tests } { "-flto" } { "" } } */

__attribute__((noipa)) void
foo (int *p)
{
  *p = 1;
}

#if __BITINT_MAXWIDTH__ >= 135
__attribute__((noipa)) void
test135 (unsigned _BitInt(135) *p, _BitInt(135) *q, int *r, int i, int j, int k)
{
  int l;
  for (l = 0; l < 15; ++l)
    {
      r[l * 4] = p[l * 2] < p[l * 2 + 1];
      r[l * 4 + 1] = p[l * 2 + i] <= p[l * 2 + 1 + i];
      r[l * 4 + 2] = p[l * 2 + j] > p[l * 2 + 1 + j];
      r[l * 4 + 3] = p[l * 2 + k] >= p[l * 2 + 1 + k];
    }
  r[60] = 0;
  if (p[30] < p[31])
    foo (r + 60);
  r[61] = 0;
  if (p[30 + i] <= p[31 + i])
    foo (r + 61);
  r[62] = 0;
  if (p[30 + j] > p[31 + j])
    foo (r + 62);
  r[63] = 0;
  if (p[30 + k] >= p[31 + k])
    foo (r + 63);
  for (l = 0; l < 15; ++l)
    {
      r[64 + l * 4] = q[l * 2] < q[l * 2 + 1];
      r[64 + l * 4 + 1] = q[l * 2 + i] <= q[l * 2 + 1 + i];
      r[64 + l * 4 + 2] = q[l * 2 + j] > q[l * 2 + 1 + j];
      r[64 + l * 4 + 3] = q[l * 2 + k] >= q[l * 2 + 1 + k];
    }
  r[124] = 0;
  if (q[30] < q[31])
    foo (r + 124);
  r[125] = 0;
  if (q[30 + i] <= q[31 + i])
    foo (r + 125);
  r[126] = 0;
  if (q[30 + j] > q[31 + j])
    foo (r + 126);
  r[127] = 0;
  if (q[30 + k] >= q[31 + k])
    foo (r + 127);
  r[128] = p[1] > 6186175750610900443940276860313653051587uwb;
  r[129] = p[1 + i] >= 6186175750610900443940276860313653051587uwb;
  r[130] = p[1 + j] < 6186175750610900443940276860313653051587uwb;
  r[131] = p[1 + k] <= 6186175750610900443940276860313653051587uwb;
  r[132] = p[9] > 532538687817519087313655352171198726194uwb;
  r[133] = p[9 + i] >= 532538687817519087313655352171198726194uwb;
  r[134] = p[9 + j] < 532538687817519087313655352171198726194uwb;
  r[135] = p[9 + k] <= 532538687817519087313655352171198726194uwb;
  r[136] = p[26] > 21437789116019123198192600268201397321728uwb;
  r[137] = p[26 + i] >= 21437789116019123198192600268201397321728uwb;
  r[138] = p[26 + j] < 21437789116019123198192600268201397321728uwb;
  r[139] = p[26 + k] <= 21437789116019123198192600268201397321728uwb;
  r[140] = 0;
  if (p[27] > 21437789116019123198192600268201397321728uwb)
    foo (r + 140);
  r[141] = 0;
  if (p[27 + i] >= 21437789116019123198192600268201397321728uwb)
    foo (r + 141);
  r[142] = 0;
  if (p[27 + j] < 21437789116019123198192600268201397321728uwb)
    foo (r + 142);
  r[143] = 0;
  if (p[27 + k] <= 21437789116019123198192600268201397321728uwb)
    foo (r + 143);
  r[144] = q[1] > -16254965323536794558278256870539623121621wb;
  r[145] = q[1 + i] >= -16254965323536794558278256870539623121621wb;
  r[146] = q[1 + j] < -16254965323536794558278256870539623121621wb;
  r[147] = q[1 + k] <= -16254965323536794558278256870539623121621wb;
  r[148] = q[9] > 18613347261447279579326452222842126033978wb;
  r[149] = q[9 + i] >= 18613347261447279579326452222842126033978wb;
  r[150] = q[9 + j] < 18613347261447279579326452222842126033978wb;
  r[151] = q[9 + k] <= 18613347261447279579326452222842126033978wb;
  r[152] = q[26] > -17354400712967861636632104979020178784256wb;
  r[153] = q[26 + i] >= -17354400712967861636632104979020178784256wb;
  r[154] = q[26 + j] < -17354400712967861636632104979020178784256wb;
  r[155] = q[26 + k] <= -17354400712967861636632104979020178784256wb;
  r[156] = 0;
  if (q[27] > -17354400712967861636632104979020178784256wb)
    foo (r + 156);
  r[157] = 0;
  if (q[27 + i] >= -17354400712967861636632104979020178784256wb)
    foo (r + 157);
  r[158] = 0;
  if (q[27 + j] < -17354400712967861636632104979020178784256wb)
    foo (r + 158);
  r[159] = 0;
  if (q[27 + k] <= -17354400712967861636632104979020178784256wb)
    foo (r + 159);
}

__attribute__((noipa)) void
check135 (void)
{
  static unsigned _BitInt(135) p[] = {
    6186175750610900443940276860313653051587uwb,
    1185851028480769106318384044302924011586uwb,
    2130297273067766631305678853840898568773uwb,
    41295820948916414032635520696820459346946uwb,
    37051876633129642187163899121207069631425uwb,
    15692033609114144435279308788278869814829uwb,
    34806164389591686493621017551199759953285uwb,
    39807523118275305743074861168614282970261uwb,
    532538687817519087313655352171198726194uwb,
    532538687817519087313655352171198726194uwb - 1,
    24327491730922412594497820631861542598095uwb,
    24327491730922412594497820631861542598095uwb + 1,
    19767147107472646435672732641055578521600uwb,
    19767147107472646435672732641055578521600uwb - 18446744073709551616uwb,
    19767147107472646435672732641055578521600uwb,
    19767147107472646435672732641055578521600uwb - 1,
    19767147107472646435672732641055578521600uwb,
    19767147107472646435672732641055578521600uwb + 1,
    19767147107472646435672732641055578521600uwb,
    19767147107472646435672732641055578521600uwb,
    21437789116019123198192600268201397321728uwb,
    21437789116019123198192600268201397321728uwb - 340282366920938463463374607431768211456uwb,
    21437789116019123198192600268201397321728uwb,
    21437789116019123198192600268201397321728uwb + 340282366920938463463374607431768211456uwb,
    21437789116019123198192600268201397321728uwb,
    21437789116019123198192600268201397321728uwb - 1,
    21437789116019123198192600268201397321728uwb,
    21437789116019123198192600268201397321728uwb + 1,
    21437789116019123198192600268201397321728uwb,
    21437789116019123198192600268201397321728uwb,
    40857776145745083896508605528597836546969uwb,
    40857776145745083896508605528597836546969uwb
  };
  static _BitInt(135) q[] = {
    -16254965323536794558278256870539623121621wb,
    3211106991591472362840917277276886624653wb,
    -11957968557477998661714306628455379156870wb,
    573207689638265971114859293369887620578wb,
    13215265693976315010419972479490962566290wb,
    -14420717597022955156949317923525514408615wb,
    9945875060497908168424655458843572357117wb,
    17414314981046040218358459297638362112560wb,
    18613347261447279579326452222842126033978wb,
    18613347261447279579326452222842126033978wb - 1,
    -7726660695587525737931429184041790718605wb,
    -7726660695587525737931429184041790718605wb + 1,
    10658663373399224161452650292046381187072wb,
    10658663373399224161452650292046381187072wb - 18446744073709551616wb,
    10658663373399224161452650292046381187072wb,
    10658663373399224161452650292046381187072wb - 1,
    10658663373399224161452650292046381187072wb,
    10658663373399224161452650292046381187072wb + 1,
    10658663373399224161452650292046381187072wb,
    10658663373399224161452650292046381187072wb,
    -17354400712967861636632104979020178784256wb,
    -17354400712967861636632104979020178784256wb - 340282366920938463463374607431768211456wb,
    -17354400712967861636632104979020178784256wb,
    -17354400712967861636632104979020178784256wb + 340282366920938463463374607431768211456wb,
    -17354400712967861636632104979020178784256wb,
    -17354400712967861636632104979020178784256wb - 1,
    -17354400712967861636632104979020178784256wb,
    -17354400712967861636632104979020178784256wb + 1,
    -17354400712967861636632104979020178784256wb,
    -17354400712967861636632104979020178784256wb,
    -9715765131124575245669270443035217820180wb,
    -9715765131124575245669270443035217820180wb
  };
  int r[160];
  static int e[160] = {
    0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0,
    0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1,
    1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1,
    0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1,
    1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0,
    0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1,
    1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0,
    0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1,
    0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0,
    1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0,
  };
  test135 (p, q, r, 0, 0, 0);
  for (int i = 0; i < 160; ++i)
    if (r[i] != e[i])
      __builtin_abort ();
}
#endif

#if __BITINT_MAXWIDTH__ >= 192
__attribute__((noipa)) void
test192 (unsigned _BitInt(192) *p, _BitInt(192) *q, int *r, int i, int j, int k)
{
  int l;
  for (l = 0; l < 15; ++l)
    {
      r[l * 4] = p[l * 2] < p[l * 2 + 1];
      r[l * 4 + 1] = p[l * 2 + i] <= p[l * 2 + 1 + i];
      r[l * 4 + 2] = p[l * 2 + j] > p[l * 2 + 1 + j];
      r[l * 4 + 3] = p[l * 2 + k] >= p[l * 2 + 1 + k];
    }
  r[60] = 0;
  if (p[30] < p[31])
    foo (r + 60);
  r[61] = 0;
  if (p[30 + i] <= p[31 + i])
    foo (r + 61);
  r[62] = 0;
  if (p[30 + j] > p[31 + j])
    foo (r + 62);
  r[63] = 0;
  if (p[30 + k] >= p[31 + k])
    foo (r + 63);
  for (l = 0; l < 15; ++l)
    {
      r[64 + l * 4] = q[l * 2] < q[l * 2 + 1];
      r[64 + l * 4 + 1] = q[l * 2 + i] <= q[l * 2 + 1 + i];
      r[64 + l * 4 + 2] = q[l * 2 + j] > q[l * 2 + 1 + j];
      r[64 + l * 4 + 3] = q[l * 2 + k] >= q[l * 2 + 1 + k];
    }
  r[124] = 0;
  if (q[30] < q[31])
    foo (r + 124);
  r[125] = 0;
  if (q[30 + i] <= q[31 + i])
    foo (r + 125);
  r[126] = 0;
  if (q[30 + j] > q[31 + j])
    foo (r + 126);
  r[127] = 0;
  if (q[30 + k] >= q[31 + k])
    foo (r + 127);
  r[128] = p[1] > 1301676158706974885001669913388788249117177822518209770103uwb;
  r[129] = p[1 + i] >= 1301676158706974885001669913388788249117177822518209770103uwb;
  r[130] = p[1 + j] < 1301676158706974885001669913388788249117177822518209770103uwb;
  r[131] = p[1 + k] <= 1301676158706974885001669913388788249117177822518209770103uwb;
  r[132] = p[9] > 4156228030920822065505406977886113255775912982125511770811uwb;
  r[133] = p[9 + i] >= 4156228030920822065505406977886113255775912982125511770811uwb;
  r[134] = p[9 + j] < 4156228030920822065505406977886113255775912982125511770811uwb;
  r[135] = p[9 + k] <= 4156228030920822065505406977886113255775912982125511770811uwb;
  r[136] = p[26] > 2105720889788939126298431571815399749254098004540680830976uwb;
  r[137] = p[26 + i] >= 2105720889788939126298431571815399749254098004540680830976uwb;
  r[138] = p[26 + j] < 2105720889788939126298431571815399749254098004540680830976uwb;
  r[139] = p[26 + k] <= 2105720889788939126298431571815399749254098004540680830976uwb;
  r[140] = 0;
  if (p[27] > 2105720889788939126298431571815399749254098004540680830976uwb)
    foo (r + 140);
  r[141] = 0;
  if (p[27 + i] >= 2105720889788939126298431571815399749254098004540680830976uwb)
    foo (r + 141);
  r[142] = 0;
  if (p[27 + j] < 2105720889788939126298431571815399749254098004540680830976uwb)
    foo (r + 142);
  r[143] = 0;
  if (p[27 + k] <= 2105720889788939126298431571815399749254098004540680830976uwb)
    foo (r + 143);
  r[144] = q[1] > 1979551028038258779576810033088645171455206196499080052958wb;
  r[145] = q[1 + i] >= 1979551028038258779576810033088645171455206196499080052958wb;
  r[146] = q[1 + j] < 1979551028038258779576810033088645171455206196499080052958wb;
  r[147] = q[1 + k] <= 1979551028038258779576810033088645171455206196499080052958wb;
  r[148] = q[9] > -1885318755168553153865626302112859755681798781213110674779wb;
  r[149] = q[9 + i] >= -1885318755168553153865626302112859755681798781213110674779wb;
  r[150] = q[9 + j] < -1885318755168553153865626302112859755681798781213110674779wb;
  r[151] = q[9 + k] <= -1885318755168553153865626302112859755681798781213110674779wb;
  r[152] = q[26] > 2339763120586619043754378424358306157273374438118242910208wb;
  r[153] = q[26 + i] >= 2339763120586619043754378424358306157273374438118242910208wb;
  r[154] = q[26 + j] < 2339763120586619043754378424358306157273374438118242910208wb;
  r[155] = q[26 + k] <= 2339763120586619043754378424358306157273374438118242910208wb;
  r[156] = 0;
  if (q[27] > 2339763120586619043754378424358306157273374438118242910208wb)
    foo (r + 156);
  r[157] = 0;
  if (q[27 + i] >= 2339763120586619043754378424358306157273374438118242910208wb)
    foo (r + 157);
  r[158] = 0;
  if (q[27 + j] < 2339763120586619043754378424358306157273374438118242910208wb)
    foo (r + 158);
  r[159] = 0;
  if (q[27 + k] <= 2339763120586619043754378424358306157273374438118242910208wb)
    foo (r + 159);
}

__attribute__((noipa)) void
check192 (void)
{
  static unsigned _BitInt(192) p[] = {
    1301676158706974885001669913388788249117177822518209770103uwb,
    747337726037626556190542632789198678519387021556252140610uwb,
    3725653947307680330137362665700857624320118783723331730354uwb,
    5392755653771808504964234887707929379898418126658160517063uwb,
    909108582379360036592925704487999488985548889672948755121uwb,
    1640061693011887757120264107651184372780544025461004778485uwb,
    1730451763775632602140993282640477950273220311662029360199uwb,
    5445606583665251502205919499903327925600190799372595230746uwb,
    4156228030920822065505406977886113255775912982125511770811uwb,
    4156228030920822065505406977886113255775912982125511770811uwb - 1,
    4265142937033285044176150866007262334836422938393615775285uwb,
    4265142937033285044176150866007262334836422938393615775285uwb + 1,
    5906690378849769161966354556531052466604912051358709841920uwb,
    5906690378849769161966354556531052466604912051358709841920uwb - 18446744073709551616uwb,
    5906690378849769161966354556531052466604912051358709841920uwb,
    5906690378849769161966354556531052466604912051358709841920uwb - 1,
    5906690378849769161966354556531052466604912051358709841920uwb,
    5906690378849769161966354556531052466604912051358709841920uwb + 1,
    5906690378849769161966354556531052466604912051358709841920uwb,
    5906690378849769161966354556531052466604912051358709841920uwb,
    2105720889788939126298431571815399749254098004540680830976uwb,
    2105720889788939126298431571815399749254098004540680830976uwb - 340282366920938463463374607431768211456uwb,
    2105720889788939126298431571815399749254098004540680830976uwb,
    2105720889788939126298431571815399749254098004540680830976uwb + 340282366920938463463374607431768211456uwb,
    2105720889788939126298431571815399749254098004540680830976uwb,
    2105720889788939126298431571815399749254098004540680830976uwb - 1,
    2105720889788939126298431571815399749254098004540680830976uwb,
    2105720889788939126298431571815399749254098004540680830976uwb + 1,
    2105720889788939126298431571815399749254098004540680830976uwb,
    2105720889788939126298431571815399749254098004540680830976uwb,
    3158000566128353648045936726901376808119543972196705250436uwb,
    3158000566128353648045936726901376808119543972196705250436uwb
  };
  static _BitInt(192) q[] = {
    1979551028038258779576810033088645171455206196499080052958wb,
    -2365185798961627132333096424325796455553365108690644933803wb,
    -72665485213084327598421838628274737858136897938197299611wb,
    -2684371926785696941292431816009231520283744219656369376907wb,
    2328570543620873568764731049988092721657822189058449467691wb,
    1166480801277674369406023216484203046859890984318705969207wb,
    2554342282302399647952757689834517321971737916674443522004wb,
    -844209391020771146100885710857828304368226088928768368272wb,
    -1885318755168553153865626302112859755681798781213110674779wb,
    -1885318755168553153865626302112859755681798781213110674779wb - 1,
    -2489570249266057242333359792314407344590632488455880158241wb,
    -2489570249266057242333359792314407344590632488455880158241wb + 1,
    -1791854374279093549336635324484455337109530403038654627840wb,
    -1791854374279093549336635324484455337109530403038654627840wb - 18446744073709551616wb,
    -1791854374279093549336635324484455337109530403038654627840wb,
    -1791854374279093549336635324484455337109530403038654627840wb - 1,
    -1791854374279093549336635324484455337109530403038654627840wb,
    -1791854374279093549336635324484455337109530403038654627840wb + 1,
    -1791854374279093549336635324484455337109530403038654627840wb,
    -1791854374279093549336635324484455337109530403038654627840wb,
    2339763120586619043754378424358306157273374438118242910208wb,
    2339763120586619043754378424358306157273374438118242910208wb - 340282366920938463463374607431768211456wb,
    2339763120586619043754378424358306157273374438118242910208wb,
    2339763120586619043754378424358306157273374438118242910208wb + 340282366920938463463374607431768211456wb,
    2339763120586619043754378424358306157273374438118242910208wb,
    2339763120586619043754378424358306157273374438118242910208wb - 1,
    2339763120586619043754378424358306157273374438118242910208wb,
    2339763120586619043754378424358306157273374438118242910208wb + 1,
    2339763120586619043754378424358306157273374438118242910208wb,
    2339763120586619043754378424358306157273374438118242910208wb,
    -3052391096360403193678321062607799919228465512652019987951wb,
    -3052391096360403193678321062607799919228465512652019987951wb
  };
  int r[160];
  static int e[160] = {
    0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0,
    0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1,
    1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0,
    0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1,
    0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1,
    0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1,
    1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0,
    0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1,
    0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0,
    0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0
  };
  test192 (p, q, r, 0, 0, 0);
  for (int i = 0; i < 160; ++i)
    if (r[i] != e[i])
      __builtin_abort ();
}
#endif

int
main ()
{
#if __BITINT_MAXWIDTH__ >= 135
  check135 ();
#endif
#if __BITINT_MAXWIDTH__ >= 192
  check192 ();
#endif
  return 0;
}
